home *** CD-ROM | disk | FTP | other *** search
- /*
- * Replist abstract class
- *
- * Copyright © John Wainwright 1988
- *
- * Superclasses:
- * List
- *
- * Purpose:
- * Used as structures that are isomorphic to some nested object
- * and contain ascii representations of the leaf nodes of that
- * object in the leaf nodes of the Replist.
- *
- * methods:
- * It inherits all methods from List except repList & print.
- */
-
- #include "oic.h"
- #include "generics.h"
-
- class Replist;
-
- struct replist_i
- {
- char *r_open; /* open bracket string */
- char *r_close; /* close bracket string */
- char *r_sep; /* separator string */
- };
- typedef struct replist_i replist_i;
-
- /* -------------------- List Instance methods ---------------------------- */
-
- static object
- _new(self, rl, symbols)
- object self;
- register replist_i *rl;
- register struct
- {
- char *open, *close, *sep;
- } *symbols;
- {
- rl->r_open = symbols->open;
- rl->r_close = symbols->close;
- rl->r_sep = symbols->sep;
-
- return self;
- }
-
- static
- _print(self)
- replist self;
- {
- print_replist(self, 0);
- printf("\n");
- }
-
- /* ------------------- printing utility functions ------------------------------- */
-
- static
- print_replist(replist, level)
- register object replist;
- register int level;
- {
- register object item;
- register replist_i *rl = localIVs(replist, replist_i);
- object seq;
-
- /*
- for (seq = sequence(replist); item = next(seq); )
- if (ClassOf(item) == Replist)
- {
- printf("%*s%s", level * 2, "", rl->r_open);
- level += 1;
- for (seq = sequence(replist); item = next(seq); )
- {
- if (ClassOf(item) == Replist)
- {
- printf("\n");
- print_replist(item, level + 1);
- }
- else
- printf("\n%*s%s", level * 2, "", stringOf(item));
-
- if ((int)moreInSeq(seq))
- printf("%s", rl->r_sep);
- }
- level -= 1;
- printf("\n%*s%s", level * 2, "", rl->r_close);
-
- return;
- }
-
- printf("%*s%s", level * 2, "", rl->r_open);
- */
-
- printf("%s", rl->r_open);
- for (seq = sequence(replist); item = next(seq); )
- {
- if (ClassOf(item) == Replist)
- print_replist(item, level + 1);
- else
- printf("%s", stringOf(item));
-
- if ((int)moreInSeq(seq))
- printf("%s", rl->r_sep);
- }
- printf("%s", rl->r_close);
- }
-
- /* ------------------- Init the Replist class ------------------------------- */
-
- _InitReplist()
- {
- Replist = NewClass(sizeof(replist_i), 0, "Replist", List, END);
- AddMethods(Replist,
- newGeneric, _new,
- printGeneric, _print,
- END);
- }
-
-